package com.juc.concurrency.jucExample.singleton;

import com.juc.concurrency.annoations.Recommend;
import com.juc.concurrency.annoations.ThreadSafe;

/**
 * 枚举模式：最安全
 * 1.枚举是单线程安全，你不需要担心双检锁问题
 * 2.传统的单例模式的另外一个问题是一旦你实现了serializable接口，他们就不再是单例的了，
 * 因为readObject()方法总是返回一个 新的实例对象，就像java中的构造器一样。枚举没这个问题
 */
@ThreadSafe
@Recommend
public class SingletonExample7 {

    // 私有构造函数
    private SingletonExample7() {

    }

    public static SingletonExample7 getInstance() {
        return Singleton.INSTANCE.getInstance();
    }

    private enum Singleton {
        INSTANCE;

        private SingletonExample7 singleton;

        // JVM保证这个方法绝对只调用一次
        Singleton() {
            singleton = new SingletonExample7();
        }

        public SingletonExample7 getInstance() {
            return singleton;
        }
    }
}
